﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace hideConsoleRun
{
    public partial class FormMain : Form
    {
        public FormMain()
        {
            InitializeComponent();
            // 关键设置：
            this.ShowInTaskbar = false;        // 不在任务栏显示
            this.WindowState = FormWindowState.Minimized; // 最小化（可选）
            this.Visible = false;              // 不可见
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            writeLog("================================= 开始启动 =============================" + Environment.NewLine + Environment.NewLine);
            if (!File.Exists("hideRun.config"))
            {
                MessageBox.Show("未找到配置文件：hideRun.config");
                writeLog("未找到配置文件：hideRun.config");
                Application.Exit();
                return;
            }

            Task.Run(() =>
            {

                // 要执行的命令：java -jar app.jar
                string command = File.ReadAllText("hideRun.config");// "java -jar app.jar";

                try
                {
                    // 创建进程启动配置
                    ProcessStartInfo startInfo = new ProcessStartInfo
                    {
                        FileName = "cmd.exe",                     // 使用 cmd.exe 执行命令
                        Arguments = $"/C {command}",              // /C 表示执行命令后关闭 cmd
                        UseShellExecute = false,                  // 必须为 false 才能重定向输入输出
                        RedirectStandardOutput = true,            // 重定向输出，便于读取结果
                        RedirectStandardError = true,             // 重定向错误输出
                        CreateNoWindow = true,                    // 不显示黑窗口
                        WindowStyle = ProcessWindowStyle.Hidden   // 隐藏窗口
                    };

                    // 启动进程
                    using (Process process = Process.Start(startInfo))
                    {
                        // 读取输出（可选）
                        string output = process.StandardOutput.ReadToEnd();
                        string error = process.StandardError.ReadToEnd();

                        // 等待命令执行完成
                        process.WaitForExit();

                        // 处理结果
                        if (process.ExitCode == 0)
                        {
                            // MessageBox.Show($"执行成功：\n{output}");                            
                            writeLog(ConvertGbkToUtf8(output));
                            // writeLog(output);
                        }
                        else
                        {
                            // MessageBox.Show($"执行失败，错误码：{process.ExitCode}\n{error}");
                            writeLog($"执行失败，错误码：{process.ExitCode}\n{ConvertGbkToUtf8(error)}");
                            // writeLog($"执行失败，错误码：{process.ExitCode}\n{error}");
                        }
                    }
                }
                catch (Exception ex)
                {
                    writeLog("执行出错：" + ex.Message);
                    MessageBox.Show("执行出错：" + ex.Message);
                }
                finally
                {
                    Application.Exit();
                    writeLog("退出程序");
                }
            });
        }

        private void writeLog(string content)
        {
            try
            {
                content = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ": " + Environment.NewLine + content;
                string logFilePath = "consoleRun.log";
                if (!File.Exists(logFilePath))
                {
                    // 文件不存在，创建并写入（或仅创建）
                    using (File.Create(logFilePath)) { } // 创建空文件
                                                         // 或者直接写入：File.WriteAllText(logFilePath, content + Environment.NewLine);
                }

                // 使用 StreamWriter 指定 GBK 编码，并追加内容
                /*using (StreamWriter writer = new StreamWriter(logFilePath, true, gbkEncoding))
                {
                    writer.WriteLine(content);
                }*/
                // 追加内容
                File.AppendAllText(logFilePath, content + Environment.NewLine, Encoding.UTF8);
            }
            catch (Exception ex)
            {
                MessageBox.Show("输出日志失败：" + ex.Message);
            }
        }

        /// <summary>
        /// 将 GBK 编码的字符串（实际是 GBK 字节）转换为 UTF-8 编码的字符串
        /// </summary>
        /// <param name="gbkString">原始字符串（内容正确，但来源是 GBK 编码）</param>
        /// <returns>UTF-8 编码的字符串（内容相同，编码不同）</returns>
        public static string ConvertGbkToUtf8(string gbkString)
        {
            // 1. 将字符串按 GBK 编码成字节（还原原始字节）
            byte[] gbkBytes = Encoding.GetEncoding("GBK").GetBytes(gbkString);

            // 2. 将 GBK 字节用 GBK 解码为正确的字符串（这步其实可省，如果 gbkString 已是正确字符串）
            //    但如果你是从 GBK 文件读取的乱码字符串，需要先：Encoding.GetEncoding("GBK").GetString(原始字节)

            // 3. 将正确的字符串重新编码为 UTF-8 字节
            byte[] utf8Bytes = Encoding.UTF8.GetBytes(gbkString);

            // 4. 将 UTF-8 字节解码为字符串（在 .NET 中字符串是 Unicode，内容不变）
            string utf8String = Encoding.UTF8.GetString(utf8Bytes);

            // 实际上，第 3+4 步等价于直接返回原字符串，因为内容没变
            // 所以真正有意义的是：把字符串保存为 UTF-8 文件，或发送 UTF-8 字节

            return utf8String; // 内容相同，只是后续可输出为 UTF-8
        }
    }
}